/**
 * 常用业务的工具函数
 */

/**
 * 定时器工具函数，与 setInterval 效果一样，不同的是使用 requestAnimationFrame 实现
 * @param {*} callback 回调函数
 * @param {*} interval 秒
 * @returns 返回一个停止执行函数
 */
export function createTimer(callback, interval) {
  let start;
  let animationFrameId;
  function loop(timestamp) {
    if (!start) start = timestamp;
    const elapsed = timestamp - start;
    if (elapsed >= interval) {
      callback();
      start = timestamp;
    }
    animationFrameId = requestAnimationFrame(loop);
  }
  animationFrameId = requestAnimationFrame(loop);
  return function stopTimer() {
    cancelAnimationFrame(animationFrameId);
  };
}

/**
 * tree过滤
 * @param {*} tree 
 * @param {*} func 执行过滤的回调函数，根据返回值进行过滤, 返回值为 布尔
 * @returns
 */
export const treeFilter = (tree, func) => {
	if (Array.isArray(tree)) {
		return tree
			.map(node => ({ ...node }))
			.filter(node => {
				if (node.children) {
					node.children = treeFilter(node.children, func)
				}
				return func(node) || (node.children && node.children.length > 0)
			})
	}
	return []
}


